home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Source / GNU / emacs / oldXMenu / Create.c < prev    next >
C/C++ Source or Header  |  1991-11-16  |  22KB  |  747 lines

  1. /* $Header: Create.c,v 1.14 88/02/02 19:02:31 jim Exp $ */
  2. /* Copyright    Massachusetts Institute of Technology    1985    */
  3.  
  4. #include "copyright.h"
  5.  
  6. /*
  7.  * XMenu:    MIT Project Athena, X Window system menu package
  8.  *
  9.  *     XMenuCreate -    Creates an X window system menu object.
  10.  *
  11.  *    Author:        Tony Della Fera, DEC
  12.  *            January 23, 1986
  13.  *
  14.  */
  15.  
  16. #include "XMenuInt.h"
  17.  
  18.  
  19. #include <X11/bitmaps/dimple1>
  20. #include <X11/bitmaps/dimple3>
  21. #include <X11/bitmaps/gray1>
  22. #include <X11/bitmaps/gray3>
  23. #include <X11/bitmaps/cross_weave>
  24.  
  25. #include <X11/bitmaps/left_ptr>
  26. #include <X11/bitmaps/left_ptrmsk>
  27. #include <X11/bitmaps/right_ptr>
  28. #include <X11/bitmaps/right_ptrmsk>
  29. #include <X11/bitmaps/cntr_ptr>
  30. #include <X11/bitmaps/cntr_ptrmsk>
  31. #include <X11/bitmaps/stipple>
  32.  
  33.  
  34. #define DEF_FREEZE        0
  35. #define DEF_REVERSE        0
  36. #define DEF_MENU_STYLE        LEFT
  37. #define DEF_MENU_MODE        BOX
  38. #define DEF_INACT_PNUM        3
  39. #define MAX_INACT_PNUM        4
  40.  
  41. #define DEF_P_STYLE        CENTER
  42.  
  43. #define DEF_P_EVENTS        (EnterWindowMask | ExposureMask)
  44. #define DEF_P_FNT_NAME        "fixed"
  45. #define DEF_P_SPREAD        0.5
  46. #define DEF_P_BDR_WIDTH        2
  47.  
  48. #define DEF_S_STYLE        LEFT
  49. #define DEF_S_EVENTS        (EnterWindowMask | LeaveWindowMask)
  50. #define DEF_S_FNT_NAME        "fixed"
  51. #define DEF_S_SPREAD        0.10
  52. #define DEF_S_BDR_WIDTH        1
  53.  
  54. #define XASSOC_TABLE_SIZE    64
  55.  
  56. #define TILE_BUF_SIZE        5
  57.  
  58. int atoi();
  59. double atof();
  60.  
  61. XMenu *
  62. XMenuCreate(display, parent, def_env)
  63.     Display *display;           /* ID of previously opened display */
  64.     Window parent;        /* Window ID of the menu's parent window. */
  65.     register char *def_env;    /* X Defaults program environment name. */
  66. {
  67.     register int i;        /* Loop counter. */
  68.     register int j;        /* Loop counter. */
  69.     register char *def_val;    /* X Default value temp variable. */
  70.  
  71.     register XMenu *menu;    /* Pointer to the new menu. */
  72.     XMStyle menu_style;        /* Menu display style. */
  73.     XMMode menu_mode;        /* Menu display mode. */
  74.     XMPane *pane;        /* Pane list header. */
  75.     XAssocTable *assoc_tab;     /* XAssocTable pointer. */
  76.  
  77.     int freeze;            /* Freeze server mode. */
  78.     int reverse;        /* Reverse video mode. */
  79.  
  80.     XMStyle p_style;        /* Pane display style. */
  81.     char *p_fnt_name;        /* Flag font name. */
  82.     XFontStruct *p_fnt_info;    /* Flag font structure */
  83.     int p_fnt_pad;        /* Flag font padding in pixels. */
  84.     double p_spread;        /* Pane spread in flag height fractions. */
  85.     int p_fnt_height;           /* Pane character height. */
  86.     int p_bdr_width;        /* Pane border width. */
  87.     int flag_height;        /* Flag window height. */
  88.     int p_height;        /* Pane window height. */
  89.     int p_x_off;        /* Pane X offset. */
  90.     int p_y_off;        /* Pane Y offset. */
  91.     GC pane_GC;            /* Pane graphics context. */
  92.  
  93.     XMStyle s_style;        /* Selection display style. */
  94.     char *s_fnt_name;        /* Selection font name. */
  95.     XFontStruct *s_fnt_info;    /* Selection font structure. */
  96.     int s_fnt_pad;        /* Selection font padding in pixels. */
  97.     int s_fnt_height;           /* Selection font character height */
  98.     double s_spread;        /* Select spread in line height fractions. */
  99.     int s_bdr_width;        /* Highlight border width. */
  100.     int s_height;        /* Selection window height. */
  101.     int s_x_off;        /* Selection window X offset. */
  102.     int s_y_off;        /* Selection window Y offset. */
  103.     GC normal_select_GC;    /* GC used for normal video selection. */
  104.     GC inverse_select_GC;    /* GC used for inverse video selection. */
  105.     GC inact_GC;        /* GC for inactive pane header and */
  106.                 /* selections. */
  107.     GC inact_GC_noexpose;
  108.  
  109.     XColor color_def;        /* Temp color definition holder. */
  110.     XColor screen_def;        /* Temp screen color defintion holder */
  111.     XColor p_bdr_color;        /* Color of border. */
  112.     XColor s_bdr_color;        /* Color of highlight. */
  113.     XColor p_frg_color;        /* Color of pane foreground color. */
  114.     XColor s_frg_color;        /* Color of selection foreground. */
  115.     XColor bkgnd_color;        /* Color of background.. */
  116.     XColor mouse_color;        /* Color of mouse cursor. */
  117.     Cursor mouse_cursor;    /* Mouse cursor. */
  118.     Pixmap inact_bitmap;        /* Menu inactive pixmap. */
  119.  
  120.     int inact_pnum;        /* Inactive background pattern number. */
  121.  
  122.     Pixel p_bdr_pixel;            /* Pane border pixel. */
  123.     Pixel s_bdr_pixel;            /* Selection border pixel. */
  124.     Pixel p_frg_pixel;            /* Pane forground pixel. */
  125.     Pixel s_frg_pixel;            /* Selection forground pixel. */
  126.     Pixel bkgnd_pixel;            /* Menu background pixel. */
  127.  
  128.     int *width, *height;
  129.     Pixmap *bitmap;
  130.     int *x_hot, *y_hot;
  131.     int status;                 /* Return code from XReadBitmapFile. */
  132.  
  133.     Pixmap cursor;              /* Cursor pixmap holder. */
  134.     Pixmap cursor_mask;         /* Cursor mask pixmap holder. */
  135.     Pixmap stipple_pixmap;    /* Stippple mask for half-tone text. */
  136.     unsigned long valuemask;
  137.     XGCValues *values;
  138.     
  139.  
  140.     /*
  141.      * Calloc the XMenu structure and the initial pane.
  142.      */
  143.     menu = (XMenu *)calloc(1, sizeof(XMenu));
  144.     if (menu == NULL) {
  145.     _XMErrorCode = XME_CALLOC;
  146.     return(NULL);
  147.     }
  148.     pane = (XMPane *)calloc(1, sizeof(XMPane));
  149.     if (pane == NULL) {
  150.     _XMErrorCode = XME_CALLOC;
  151.     return(NULL);
  152.     }
  153.     
  154.     /* 
  155.      * Create the XAssocTable
  156.      */
  157.     assoc_tab = (XAssocTable *)XCreateAssocTable(XASSOC_TABLE_SIZE);
  158.     if(assoc_tab == NULL) {
  159.     _XMErrorCode= XME_CREATE_ASSOC;
  160.     return(NULL);
  161.     }
  162.  
  163.     /*
  164.      * Set up the default environment name.
  165.      */
  166.     if (def_env == NULL || *def_env == '\0') def_env = "XMenu";
  167.  
  168.     /*
  169.      * Set up internal fail-safe defaults.
  170.      */
  171.     freeze = DEF_FREEZE;
  172.     reverse = DEF_REVERSE;
  173.     menu_style = DEF_MENU_STYLE;
  174.     menu_mode = DEF_MENU_MODE;
  175.     inact_pnum = DEF_INACT_PNUM;
  176.  
  177.     p_style = DEF_P_STYLE;
  178.     p_spread = DEF_P_SPREAD;
  179.     p_fnt_name = DEF_P_FNT_NAME;
  180.     p_bdr_width = DEF_P_BDR_WIDTH;
  181.  
  182.     s_style = DEF_S_STYLE;
  183.     s_spread = DEF_S_SPREAD;
  184.     s_fnt_name = DEF_S_FNT_NAME;
  185.     s_bdr_width = DEF_S_BDR_WIDTH;
  186.  
  187.     /*
  188.      * Get default values from X.
  189.      */
  190.     def_val = XGetDefault(display, def_env, "MenuFreeze");
  191.     if (def_val != NULL) {
  192.     if (strcmp(def_val, "on") == 0) freeze = 1;
  193.     else if (strcmp(def_val, "off") == 0) freeze = 0;
  194.     }
  195.  
  196.     def_val = XGetDefault(display, def_env, "MenuReverseVideo");
  197.     if (def_val != NULL) {
  198.     if (strcmp(def_val, "on") == 0) reverse = 1;
  199.     else if (strcmp(def_val, "off") == 0) reverse = 0;
  200.     }
  201.  
  202.     def_val = XGetDefault(display, def_env, "MenuStyle");
  203.     if (def_val != NULL) {
  204.     if (strcmp(def_val, "right_hand") == 0) menu_style = RIGHT;
  205.     else if (strcmp(def_val, "left_hand") == 0) menu_style = LEFT;
  206.     else if (strcmp(def_val, "center") == 0) menu_style = CENTER;
  207.     }
  208.  
  209.     def_val = XGetDefault(display, def_env, "MenuMode");
  210.     if (def_val != NULL) {
  211.     if (strcmp(def_val, "box") == 0) menu_mode = BOX;
  212.     else if (strcmp(def_val, "invert") == 0) menu_mode = INVERT;
  213.     }
  214.     
  215.     def_val = XGetDefault(display, def_env, "MenuMouse");
  216.     if (
  217.     def_val != NULL &&
  218.     DisplayCells(display, DefaultScreen(display)) > 2 &&
  219.     XAllocNamedColor(display, 
  220.              DefaultColormap(display, DefaultScreen(display)), 
  221.              def_val, 
  222.              &mouse_color, &color_def)
  223.     );
  224.     else if (reverse &&
  225.          XAllocNamedColor(display,
  226.                   DefaultColormap(display, DefaultScreen(display)),
  227.                   "white",
  228.                   &mouse_color, &color_def)
  229.          );
  230.     
  231.     else if (XAllocNamedColor(display,
  232.                   DefaultColormap(display, DefaultScreen(display)),
  233.                   "black", 
  234.                   &mouse_color, &color_def)
  235.          );
  236.     
  237.     else ;
  238.  
  239.     def_val = XGetDefault(display, def_env, "MenuBackground");
  240.     if (
  241.     def_val != NULL &&
  242.     DisplayCells(display, DefaultScreen(display)) > 2 &&
  243.     XAllocNamedColor(display,
  244.              DefaultColormap(display, DefaultScreen(display)),
  245.              def_val,
  246.              &bkgnd_color, &color_def)
  247.     );
  248.     else if (reverse &&
  249.          XAllocNamedColor(display,
  250.                   DefaultColormap(display, DefaultScreen(display)),
  251.                   "black",
  252.                   &bkgnd_color, &color_def)
  253.          );
  254.     else if (XAllocNamedColor(display,
  255.                   DefaultColormap(display, DefaultScreen(display)),
  256.                   "white",
  257.                   &bkgnd_color, &color_def)
  258.          );
  259.     else;
  260.  
  261.     def_val = XGetDefault(display, def_env, "MenuInactivePattern");
  262.     if (def_val != NULL) {
  263.     if (strcmp(def_val, "dimple1") == 0) inact_pnum = 0;
  264.     else if (strcmp(def_val, "dimple3") == 0) inact_pnum = 1;
  265.     else if (strcmp(def_val, "gray1") == 0) inact_pnum = 2;
  266.     else if (strcmp(def_val, "gray3") == 0) inact_pnum = 3;
  267.     else if (strcmp(def_val, "cross_weave") == 0) inact_pnum = 4;
  268.     }
  269.  
  270.     def_val = XGetDefault(display, def_env, "PaneStyle");
  271.     if (def_val != NULL) {
  272.     if (strcmp(def_val, "flush_left") == 0) p_style = LEFT;
  273.     else if (strcmp(def_val, "flush_right") == 0) p_style = RIGHT;
  274.     else if (strcmp(def_val, "center") == 0) p_style = CENTER;
  275.     }
  276.  
  277.     def_val = XGetDefault(display, def_env, "PaneFont");
  278.     if (def_val != NULL) p_fnt_name = def_val;
  279.  
  280.     def_val = XGetDefault(display, def_env, "PaneForeground");
  281.     if (
  282.     def_val != NULL &&
  283.     DisplayCells(display, DefaultScreen(display)) > 2 
  284.     )
  285.       XAllocNamedColor(display, DefaultColormap(display,
  286.                         DefaultScreen(display)),
  287.                def_val,
  288.                &p_frg_color, &color_def);
  289.       
  290.     else if (reverse) XAllocNamedColor(display,
  291.                        DefaultColormap(display, 
  292.                                DefaultScreen(display)),
  293.                        "white",
  294.                        &p_frg_color, &color_def);
  295.     else XAllocNamedColor(display,
  296.               DefaultColormap(display, DefaultScreen(display)),
  297.               "black",
  298.               &p_frg_color, &color_def);
  299.  
  300.     def_val = XGetDefault(display, def_env, "PaneBorder");
  301.     if (
  302.     def_val != NULL &&
  303.     DisplayCells(display, DefaultScreen(display)) > 2 &&
  304.     XAllocNamedColor(display,
  305.              DefaultColormap(display, DefaultScreen(display)),
  306.              def_val,
  307.              &p_bdr_color, &color_def)
  308.     );
  309.     else if (reverse &&
  310.          XAllocNamedColor(display, 
  311.                   DefaultColormap(display, DefaultScreen(display)),
  312.                   "white",
  313.                   &p_bdr_color, &color_def)
  314.          );
  315.     else XAllocNamedColor(display, 
  316.               DefaultColormap(display, DefaultScreen(display)),
  317.               "black",
  318.               &p_bdr_color, &color_def);
  319.     
  320.     def_val = XGetDefault(display, def_env, "PaneBorderWidth");
  321.     if (def_val != NULL) p_bdr_width = atoi(def_val);
  322.     
  323.     def_val = XGetDefault(display, def_env, "PaneSpread");
  324.     if (def_val != NULL) p_spread = atof(def_val);
  325.  
  326.     def_val = XGetDefault(display, def_env, "SelectionStyle");
  327.     if (def_val != NULL) {
  328.     if (strcmp(def_val, "flush_left") == 0) s_style = LEFT;
  329.     else if (strcmp(def_val, "flush_right") == 0) s_style = RIGHT;
  330.     else if (strcmp(def_val, "center") == 0) s_style = CENTER;
  331.     }
  332.  
  333.     def_val = XGetDefault(display, def_env, "SelectionFont");
  334.     if (def_val != NULL) s_fnt_name = def_val;
  335.  
  336.     def_val = XGetDefault(display, def_env, "SelectionForeground");
  337.     if (
  338.     def_val != NULL &&
  339.     DisplayCells(display, DefaultScreen(display)) > 2 &&
  340.     XAllocNamedColor(display,
  341.              DefaultColormap(display, DefaultScreen(display)),
  342.              def_val,
  343.              &s_frg_color, &color_def)
  344.     ); 
  345.     else if (reverse &&
  346.          XAllocNamedColor(display,
  347.                   DefaultColormap(display, DefaultScreen(display)),
  348.                   "white",
  349.                   &s_frg_color, &color_def)
  350.          ) ;
  351.     else if (XAllocNamedColor(display,
  352.                   DefaultColormap(display, DefaultScreen(display)),
  353.                   "black",
  354.                   &s_frg_color, &color_def)
  355.          ) ;
  356.     else ;
  357.     
  358.  
  359.     def_val = XGetDefault(display, def_env, "SelectionBorder");
  360.     if (
  361.     def_val != NULL &&
  362.     DisplayCells(display, DefaultScreen(display)) > 2 &&
  363.     XAllocNamedColor(display,
  364.              DefaultColormap(display, DefaultScreen(display)),
  365.              def_val,
  366.              &s_bdr_color, &color_def)
  367.     ) ;
  368.     else if (reverse &&
  369.          XAllocNamedColor(display, 
  370.                   DefaultColormap(display, DefaultScreen(display)),
  371.                   "white",
  372.                   &s_bdr_color, &color_def)
  373.          ) ;
  374.     else if (XAllocNamedColor(display,
  375.                   DefaultColormap(display, DefaultScreen(display)),
  376.                   "black",
  377.                   &s_bdr_color, &color_def)
  378.          ) ;
  379.     else ;
  380.  
  381.     def_val = XGetDefault(display, def_env, "SelectionBorderWidth");
  382.     if (def_val != NULL) s_bdr_width = atoi(def_val);
  383.     
  384.     def_val = XGetDefault(display, def_env, "SelectionSpread");
  385.     if (def_val != NULL) s_spread = atof(def_val);
  386.  
  387.     /*
  388.      * Create and store the inactive pattern pixmap.
  389.      */
  390.     switch (inact_pnum) 
  391.       {
  392.   case 0:
  393.       inact_bitmap = XCreateBitmapFromData(
  394.                            display,
  395.                            RootWindow(display, DefaultScreen(display)), 
  396.                            dimple1_bits, 
  397.                            16, 16
  398.                            );
  399.       break;
  400.   case 1:
  401.       inact_bitmap = XCreateBitmapFromData(
  402.                            display, 
  403.                            RootWindow(display, DefaultScreen(display)), 
  404.                            dimple3_bits, 
  405.                            16,16);
  406.       break;
  407.   case 2:
  408.       inact_bitmap = XCreateBitmapFromData(
  409.                            display, RootWindow(display, DefaultScreen(display)), 
  410.                            gray1_bits, 16, 16);
  411.       break;
  412.   case 3:
  413.       inact_bitmap = XCreateBitmapFromData(
  414.                            display, 
  415.                            RootWindow(display, DefaultScreen(display)), 
  416.                            gray3_bits, 16, 16);
  417.       break;
  418.   case 4:
  419.       inact_bitmap = XCreateBitmapFromData(
  420.                            display, 
  421.                            RootWindow(display, DefaultScreen(display)), 
  422.                            cross_weave_bits, 16, 16);
  423.       break;
  424.   default:
  425.       break;
  426.       
  427.       }
  428.     if (inact_bitmap == NULL) {
  429.     _XMErrorCode = XME_STORE_BITMAP;
  430.     return(NULL);
  431.     }
  432.  
  433.     /*
  434.      * Load the mouse cursor.
  435.      */
  436.       
  437.     switch (menu_style) {
  438.         case LEFT:
  439.         cursor = XCreateBitmapFromData(display,
  440.                        RootWindow(display,
  441.                               DefaultScreen(display)),
  442.                        left_ptr_bits,
  443.                        left_ptr_width,
  444.                        left_ptr_height);
  445.         cursor_mask = XCreateBitmapFromData(display,
  446.                             RootWindow(display,
  447.                               DefaultScreen(display)),
  448.                             left_ptrmsk_bits,
  449.                             left_ptrmsk_width,
  450.                             left_ptrmsk_height);
  451.         mouse_cursor = XCreatePixmapCursor(
  452.                            display,
  453.                            cursor, cursor_mask, 
  454.                            &mouse_color, &bkgnd_color,
  455.                            left_ptr_x_hot,
  456.                            left_ptr_y_hot
  457.                            );
  458.         XFreePixmap(display, cursor);
  459.         XFreePixmap(display, cursor_mask);        
  460.         break;
  461.         case RIGHT:
  462.         cursor = XCreateBitmapFromData(display,
  463.                        RootWindow(display,
  464.                               DefaultScreen(display)),
  465.                        right_ptr_bits,
  466.                        right_ptr_width,
  467.                        right_ptr_height);
  468.         cursor_mask = XCreateBitmapFromData(display,
  469.                             RootWindow(display,
  470.                               DefaultScreen(display)),
  471.                             right_ptrmsk_bits,
  472.                             right_ptrmsk_width,
  473.                             right_ptrmsk_height);
  474.         mouse_cursor = XCreatePixmapCursor(
  475.                            display,
  476.                            cursor, cursor_mask,
  477.                            &mouse_color, &bkgnd_color,
  478.                            right_ptr_x_hot,
  479.                            right_ptr_y_hot
  480.                            );
  481.         XFreePixmap(display, cursor);
  482.         XFreePixmap(display, cursor_mask);        
  483.         break;
  484.         case CENTER:
  485.         cursor = XCreateBitmapFromData(display,
  486.                        RootWindow(display,
  487.                               DefaultScreen(display)),
  488.                        cntr_ptr_bits,
  489.                        cntr_ptr_width,
  490.                        cntr_ptr_height);
  491.         cursor_mask = XCreateBitmapFromData(display,
  492.                             RootWindow(display,
  493.                               DefaultScreen(display)),
  494.                             cntr_ptrmsk_bits,
  495.                             cntr_ptrmsk_width,
  496.                             cntr_ptrmsk_height);
  497.         mouse_cursor = XCreatePixmapCursor(
  498.                            display,
  499.                            cursor, cursor_mask,
  500.                            &mouse_color, &bkgnd_color,
  501.                            cntr_ptr_x_hot,
  502.                            cntr_ptr_y_hot
  503.                            );
  504.         XFreePixmap(display, cursor);
  505.         XFreePixmap(display, cursor_mask);        
  506.     break;
  507.  default:
  508.     /* Error! Invalid style parameter. */
  509.     _XMErrorCode = XME_STYLE_PARAM;
  510.     return(NULL);
  511.     }
  512.     if (mouse_cursor == _X_FAILURE) {
  513.     _XMErrorCode = XME_CREATE_CURSOR;
  514.     return(NULL);
  515.     }
  516.  
  517.     /*
  518.      * Open the pane and selection fonts.
  519.      */
  520.     
  521.     p_fnt_info = XLoadQueryFont(display, p_fnt_name);
  522.     if (p_fnt_info == NULL) {
  523.     _XMErrorCode = XME_OPEN_FONT;
  524.     return(NULL);
  525.     
  526.     }
  527.  
  528.     s_fnt_info = XLoadQueryFont(display, s_fnt_name);
  529.     if (s_fnt_info == NULL) {
  530.     _XMErrorCode = XME_OPEN_FONT;
  531.     return(NULL);
  532.     }
  533.     /*
  534.      * Calculate the fixed padding value in pixels for each font.
  535.      */
  536.     p_fnt_height = p_fnt_info->max_bounds.ascent + p_fnt_info->max_bounds.descent;
  537.     s_fnt_height = s_fnt_info->max_bounds.ascent + s_fnt_info->max_bounds.descent;
  538.     p_fnt_pad = s_spread * p_fnt_height;
  539.     s_fnt_pad = s_spread * s_fnt_height;
  540.  
  541.     /*
  542.      * Calculate fixed height and offset requirements.
  543.      */
  544.     flag_height = p_fnt_height + (p_fnt_pad << 1);
  545.  
  546.     p_height = 0;
  547.     p_y_off = flag_height + p_bdr_width;
  548.     p_x_off = p_y_off * p_spread;
  549.  
  550.     s_height = s_fnt_height + (s_fnt_pad << 1) + (s_bdr_width << 1);
  551.     s_y_off = s_height;
  552.     s_x_off = p_x_off;
  553.  
  554.     /*
  555.      * Set up the pane list header.
  556.      */
  557.     pane->next = pane;
  558.     pane->prev = pane;
  559.     pane->type = PL_HEADER;
  560.     pane->serial = -1;
  561.  
  562.     /*
  563.      * Initialize the internal pane and selection creation queues.
  564.      */
  565.     _XMWinQueInit();
  566.     
  567.     /*
  568.      * Create pane, active, and inactive GC's.
  569.      */
  570.     values = (XGCValues *)malloc(sizeof(XGCValues));
  571.     valuemask = (GCForeground | GCBackground | GCFont | GCLineWidth);
  572.  
  573.     /*
  574.      * First, pane.
  575.      */
  576.  
  577.     values->foreground = p_frg_color.pixel;
  578.     values->background = bkgnd_color.pixel;
  579.     values->font = p_fnt_info->fid;
  580.     values->line_width = p_bdr_width;
  581.     
  582.     pane_GC = XCreateGC(
  583.             display, 
  584.             RootWindow(display, DefaultScreen(display)),
  585.             valuemask,
  586.             values);
  587.     /*
  588.      * Then normal video selection.
  589.      */
  590.  
  591.     values->foreground = s_frg_color.pixel;
  592.     values->background = bkgnd_color.pixel;
  593.     values->font = s_fnt_info->fid;
  594.     values->line_width = s_bdr_width;
  595.     normal_select_GC = XCreateGC(display, 
  596.                  RootWindow(display, DefaultScreen(display)),
  597.                  valuemask,
  598.                  values);
  599.     /*
  600.      * Inverse video selection.
  601.      */
  602.  
  603.     values->foreground = bkgnd_color.pixel;        
  604.     values->background = s_frg_color.pixel;
  605.     values->font = s_fnt_info->fid;
  606.     values->line_width = s_bdr_width;
  607.     inverse_select_GC = XCreateGC(display, 
  608.                   RootWindow(display, DefaultScreen(display)),
  609.                   valuemask,
  610.                   values);
  611.     stipple_pixmap = XCreateBitmapFromData(display,
  612.                        RootWindow(display,
  613.                               DefaultScreen(display)),
  614.                        stipple_bits,        
  615.                        stipple_width,        
  616.                        stipple_height);    
  617.     
  618.     /*
  619.      * Finally, inactive pane header and selections
  620.      */
  621.     valuemask |= (GCFillStyle | GCStipple);
  622.     values->foreground = s_frg_color.pixel;
  623.     values->background = bkgnd_color.pixel;
  624.     values->font = s_fnt_info->fid;
  625.     values->line_width = s_bdr_width;
  626.     values->fill_style = FillStippled;
  627.     values->stipple = stipple_pixmap;
  628.     
  629.     inact_GC = XCreateGC(display, 
  630.              RootWindow(display, DefaultScreen(display)),
  631.              valuemask,
  632.              values);
  633.  
  634.     valuemask |= (GCGraphicsExposures);
  635.     values->graphics_exposures = False;
  636.     inact_GC_noexpose = XCreateGC (display, 
  637.                        RootWindow (display, 
  638.                            DefaultScreen (display)),
  639.                    valuemask, values);
  640.  
  641.  
  642.     /*
  643.      * Construct the XMenu object.
  644.      */
  645.     /* -------------------- Menu data -------------------- */
  646.     menu->menu_style = menu_style;
  647.     menu->menu_mode = menu_mode;
  648.     menu->freeze = freeze;
  649.     menu->aeq = 0;
  650.     menu->recompute = 1;
  651.     menu->parent = parent;
  652.     menu->height = 0;
  653.     menu->width = 0;
  654.     menu->mouse_cursor = mouse_cursor;
  655.     menu->assoc_tab = assoc_tab;
  656.     menu->p_list = pane;
  657.     /* -------------------- Pane window data -------------------- */
  658.     menu->p_style = p_style;
  659.     menu->p_events = DEF_P_EVENTS;
  660.     menu->p_fnt_info = p_fnt_info;
  661.     menu->p_fnt_pad = p_fnt_pad;
  662.     menu->p_spread = p_spread;
  663.     menu->p_bdr_width = p_bdr_width;
  664.     menu->flag_height = flag_height;
  665.     menu->p_width = 0;
  666.     menu->p_height = p_height;
  667.     menu->p_x_off = p_x_off;
  668.     menu->p_y_off = p_y_off;
  669.     menu->p_count = 0;
  670.     menu->pane_GC = pane_GC;
  671.     menu->x_pos = 0;
  672.     menu->y_pos = 0;
  673.     /* -------------------- Selection window data -------------------- */
  674.     menu->s_style = s_style;
  675.     menu->s_events = DEF_S_EVENTS;
  676.     menu->s_fnt_info = s_fnt_info;
  677.     menu->s_fnt_pad = s_fnt_pad;
  678.     menu->s_spread = s_spread;
  679.     menu->s_bdr_width = s_bdr_width;        /* unnecessary */
  680.     menu->s_width = 0;
  681.     menu->s_height = s_height;
  682.     menu->s_x_off = s_x_off;
  683.     menu->s_y_off = s_y_off;
  684.     menu->s_count = 0;
  685.     menu->normal_select_GC = normal_select_GC;
  686.     menu->inverse_select_GC = inverse_select_GC;
  687.     menu->inact_GC = inact_GC;
  688.     /* -------------------- Color data -------------------- */
  689.     menu->p_bdr_color = p_bdr_color.pixel;
  690.     menu->s_bdr_color = s_bdr_color.pixel;
  691.     menu->p_frg_color = p_frg_color.pixel;
  692.     menu->s_frg_color = s_frg_color.pixel;
  693.     menu->bkgnd_color = bkgnd_color.pixel;
  694.     /* -------------------- Pixmap data -------------------- */
  695.     menu->p_bdr_pixmap = NULL;
  696.     menu->s_bdr_pixmap = NULL;
  697.     menu->p_frg_pixmap = NULL;
  698.     menu->s_frg_pixmap = NULL;
  699.     menu->bkgnd_pixmap = NULL;
  700.     if (DisplayPlanes (display, DefaultScreen (display)) == 1)
  701.     menu->inact_pixmap = inact_bitmap;
  702.     else
  703.     {
  704.     int loop;
  705.     
  706.     menu->inact_pixmap = XCreatePixmap (display,
  707.                         parent,
  708.                         16,
  709.                         16,
  710.                         DisplayPlanes (display,
  711.                                DefaultScreen (display)));
  712.     if (menu->inact_pixmap == NULL)
  713.     {
  714.         _XMErrorCode = XME_STORE_BITMAP;
  715.         return(NULL);
  716.     }
  717.  
  718.     XCopyPlane (display, inact_bitmap, menu->inact_pixmap, 
  719.             inact_GC_noexpose, 0, 0, 16, 16, 0, 0, 1);
  720.  
  721. /*
  722.     for (loop = 0;
  723.          loop < DisplayPlanes (display, DefaultScreen (display));
  724.          loop++)
  725.     {
  726.         XCopyPlane (display,
  727.             inact_bitmap,
  728.             menu->inact_pixmap,
  729.             inact_GC,
  730.             0,
  731.             0,
  732.             16,
  733.             16,
  734.             0,
  735.             0,
  736.             (1 << loop));
  737.     }
  738. */
  739.     }
  740.  
  741.     /*
  742.      * Return the completed XMenu.
  743.      */
  744.     _XMErrorCode = XME_NO_ERROR;
  745.     return(menu);
  746. }
  747.